const { PropertyModel, EvaluateModel } = require('../../models/index')
const { Op } = require('sequelize')

// 获取房源列表信息
const getPropertyList = async (req, res) => {
  try {
    // 获取页码和每页大小
    const { page, pageSize } = req.query

    // 确保页码和每页大小是有效的数字
    if (isNaN(parseInt(page, 10)) || isNaN(parseInt(pageSize, 10)) || pageSize <= 0) {
      return res.status(400).json({ error: '无效的页码或每页大小' })
    }

    // 计算offset
    const offset = (parseInt(page, 10) - 1) * parseInt(pageSize, 10)

    // 房源类型列表
    const mapQuertType = [
      { type: '0', propertyType: '' },
      { type: '1', propertyType: '整租' },
      { type: '2', propertyType: '合租' },
      { type: '3', propertyType: '短租' },
      { type: '4', propertyType: '长租' }
    ]

    // 根据房源类型列表设置筛选条件
    let whereClause = {}
    if (req.query.type && req.query.type !== '0') {
      const filterType = mapQuertType[req.query.type].propertyType
      whereClause = { rent_type: filterType }
    }

    const propertyList = await PropertyModel.findAndCountAll({
      attributes: ['id', 'title', 'address', 'resident', 'county', 'room_count', 'livingroom_count', 'room_area', 'price', 'image_url', 'rent_type', 'room_direction'],
      where: whereClause,
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    res.status(200).json({
      title: '房源列表信息',
      propertyList
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }

}

// 获取房源详情信息
const getPropertyDetail = async (req, res) => {
  try {
    const id = req.params.id

    // 房源ID不存在的情况
    if (!id || isNaN(parseInt(id, 10))) {
      return res.status(400).json({ error: '无效的房源ID!' })
    }

    const propertyDetail = await PropertyModel.findByPk(id)

    // 查找房源不存在的情况
    if (!propertyDetail) {
      return res.status(404).json({ error: '未匹配到房源信息！' })
    }

    // 查找房源成功
    res.status(200).json({
      title: '房源详情信息',
      propertyDetail
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取热门房源信息
const getHotProperty = async (req, res) => {
  try {
    // 获取页码和每页大小
    const { page, pageSize } = req.query

    // 确保页码和每页大小是有效的数字
    if (isNaN(parseInt(page, 10)) || isNaN(parseInt(pageSize, 10)) || pageSize <= 0) {
      return res.status(400).json({ error: '无效的页码或每页大小' })
    }

    // 计算offset
    const offset = (parseInt(page, 10) - 1) * parseInt(pageSize, 10)

    // 获取热门房源总数
    const totalCount = await PropertyModel.count({
      where: {
        is_hot: 1
      }
    })

    // 获取热门房源信息
    const hotProperty = await PropertyModel.findAll({
      where: {
        is_hot: 1,
      },
      attributes: ['id', 'title', 'address', 'resident', 'room_count', 'livingroom_count', 'price', 'image_url', 'rent_type', 'createdAt', 'updatedAt'],
      include: [
        {
          model: EvaluateModel,
          as: 'evaluate',
          attributes: ['rating', 'comment']
        }
      ],
      order: [
        ['updatedAt', 'DESC'],
        ['createdAt', 'DESC']
      ],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    res.status(200).json({
      title: '热门房源信息',
      data: {
        count: totalCount,
        rows: hotProperty
      }
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取品牌公寓信息
const getApartmentInfo = async (req, res) => {
  try {
    // 获取页码和每页大小
    const { page, pageSize } = req.query

    // 确保页码和每页大小是有效的数字
    if (isNaN(parseInt(page, 10)) || isNaN(parseInt(pageSize, 10)) || pageSize <= 0) {
      return res.status(400).json({ error: '无效的页码或每页大小' })
    }

    // 计算offset
    const offset = (parseInt(page, 10) - 1) * parseInt(pageSize, 10)


    const apartmentInfo = await PropertyModel.findAndCountAll({
      where: {
        room_type: '公寓',
      },
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    res.status(200).json({
      title: '热门房源信息',
      data: apartmentInfo
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取精选别墅信息
const getVillaInfo = async (req, res) => {
  try {
    // 获取页码和每页大小
    const { page, pageSize } = req.query

    // 确保页码和每页大小是有效的数字
    if (isNaN(parseInt(page, 10)) || isNaN(parseInt(pageSize, 10)) || pageSize <= 0) {
      return res.status(400).json({ error: '无效的页码或每页大小' })
    }

    // 计算offset
    const offset = (parseInt(page, 10) - 1) * parseInt(pageSize, 10)

    const villaInfo = await PropertyModel.findAndCountAll({
      where: {
        room_type: '别墅',
      },
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    res.status(200).json({
      title: '热门房源信息',
      data: villaInfo
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 搜索房源
const searchProperty = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const propertyItem = await PropertyModel.findAll({
      where: {
        [Op.or]: [
          { title: { [Op.like]: `%${searchText}%` } },
          { description: { [Op.like]: `%${searchText}%` } },
          { address: { [Op.like]: `%${searchText}%` } },
          { resident: { [Op.like]: `%${searchText}%` } },
          { county: { [Op.like]: `%${searchText}%` } },
          { city: { [Op.like]: `%${searchText}%` } },
          { province: { [Op.like]: `%${searchText}%` } },
          { room_type: { [Op.like]: `%${searchText}%` } },
          { decorate_type: { [Op.like]: `%${searchText}%` } },
          { rent_type: { [Op.like]: `%${searchText}%` } },
          { room_direction: { [Op.like]: `%${searchText}%` } },
        ]
      }
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: propertyItem
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

module.exports = {
  getPropertyList,
  getPropertyDetail,
  getHotProperty,
  getApartmentInfo,
  getVillaInfo,
  searchProperty
}